import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.Toolkit;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;

import javax.imageio.ImageIO;

/**
 * copyright    Founder 2010
 * @date        2011-6-13 V1.0新規作成
 *              dateタグの第二行目のコメント
 * @author      Administrator
 * @version     V1.0
 * @brief       xxxClassクラスの定義
 *              クラス概要説明の第二行目のコメント
 * @since       1.0
 * @todo        未完了事項1
 */
public class JniTest
{

    static
    {
        System.setProperty("java.liberty.path", ".");
        System.out.println(System.getProperty("java.liberty.path"));
        System.loadLibrary("CodeCvt");
        System.loadLibrary("MercProcessor");
        System.loadLibrary("XEKrnl");
        System.loadLibrary("hello");
    }

    public native boolean C2I_Init(int version);

    // / <summary>
    // / 获取CEBX文件中的文档个数。
    // / </summary>
    // / <param name="szFileName">文件路径</param>
    // / <param name="msgCode">出错代码</param>
    // / <returns></returns>
    // [DllImport("CEBX2Image.dll", CharSet = CharSet.Auto)]
    public native int C2I_GetDocumentCount(String szFileName, Integer msgCode);

    // / <summary>
    // / 获取文档加密类型。
    // / </summary>
    // / <param name="szFileName">文件路径</param>
    // / <param name="nDocIndex">文档在CEBX文件中的索引值，从0开始。</param>
    // / <param name="msgCode">出错代码</param>
    // / <returns>如果成功返回文档加密类型，否则返回C2I_SECURITY_ERROR。</returns>
    // [DllImport("CEBX2Image.dll", CharSet = CharSet.Auto)]
    public native int C2I_GetDocSecurityType(String szFileName, long nDocIndex,
            Integer msgCode);

    // / <summary>
    // / 打开未加密文档。
    // / </summary>
    // / <param name="szFileName"></param>
    // / <param name="nDocIndex"></param>
    // / <param name="msgCode"></param>
    // / <returns></returns>
    // [DllImport("CEBX2Image.dll", CharSet = CharSet.Auto)]
    public native int C2I_OpenDoc(String szFileName, long nDocIndex,
            Integer msgCode);

    // / <summary>
    // / 打开本地加密文档。
    // / </summary>
    // / <param name="szFileName"></param>
    // / <param name="nDocIndex"></param>
    // / <param name="szPassword">本地加密密码</param>
    // / <param name="msgCode"></param>
    // / <returns></returns>
    // [DllImport("CEBX2Image.dll", CharSet = CharSet.Auto)]
    public native int C2I_OpenLocalSecurityDoc(String szFileName,
            long nDocIndex, String szPassword, Integer msgCode);

    // / <summary>
    // / 打开DRM加密文档。
    // / </summary>
    // / <param name="szFileName"></param>
    // / <param name="nDocIndex"></param>
    // / <param name="drmKey">DRM密钥</param>
    // / <param name="drmKeyLeg">DRM密钥长度</param>
    // / <param name="msgCode"></param>
    // / <returns></returns>
    // [DllImport("CEBX2Image.dll", CharSet = CharSet.Auto)]
    public native int C2I_OpenDRMSecurityDoc(String szFileName, long nDocIndex,
            Byte[] drmKey, int drmKeyLeg, Integer msgCode);

    // / <summary>
    // / 获取电子书页数
    // / </summary>
    // / <param name="hDoc"></param>
    // / <returns></returns>
    // [DllImport("CEBX2Image.dll", CharSet = CharSet.Auto)]
    public native int C2I_GetPageCount(int hDoc);

    // / <summary>
    // / 获取页面大小，返回为像素单位
    // / </summary>
    // / <param name="hDoc"></param>
    // / <param name="dwPage"></param>
    // / <param name="type"></param>
    // / <param name="nWidth"></param>
    // / <param name="nHeight"></param>
    // / <returns></returns>
    // [DllImport("CEBX2Image.dll", CharSet = CharSet.Auto)]
    public native boolean C2I_GetPageBox(int hDoc, Long dwPage, int type,
            Double width, Double height);

    // / <summary>
    // / 获取指定页指定放缩比图片数据大小，与C2IGetData成对使用
    // / </summary>
    // / <param name="hDoc"></param>
    // / <param name="dwPage"></param>
    // / <param name="dXScale"></param>
    // / <param name="dYScale"></param>
    // / <param name="width"></param>
    // / <param name="height"></param>
    // / <param name="nSize"></param>
    // / <returns></returns>
    // [DllImport("CEBX2Image.dll", CharSet = CharSet.Auto)]
    // public native int C2I_GetSize(int hDoc, long dwPage, double xScale,
    // double yScale, Args input);
    public native int GetSize(int hDoc, long dwPage, double xScale,
            double yScale, Args args);

    // / <summary>
    // / 获取指定页指定放缩比的图片数据
    // / </summary>
    // / <param name="nSize"></param>
    // / <param name="hMem"></param>
    // / <param name="picData"></param>
    // [DllImport("CEBX2Image.dll", CharSet = CharSet.Auto)]
    public native void C2I_GetData(int size, int hMem, Byte[] picData);

    // / <summary>
    // / 初始化流式信息
    // / </summary>
    // / <param name="hDoc">文件句柄</param>
    // / <param name="dwPage">页码</param>
    // / <param name="hMem">内存句柄</param>
    // / <param name="lSize">内存块大小</param>
    // / <returns></returns>
    // [DllImport("CEBX2Image.dll", CharSet = CharSet.Unicode)]
    public native boolean C2I_InitPageStream(int hDoc, long dwPage,
            Integer hMem, Integer lSize);

    // / <summary>
    // / 获取初始化过的流式信息
    // / </summary>
    // / <param name="hMem">内存句柄</param>
    // / <param name="lSize">内存块大小</param>
    // / <param name="pStream">传出流式信息，注意先申请lSize大小的字节的内存空间</param>
    // / <returns></returns>
    // [DllImport("CEBX2Image.dll", CharSet = CharSet.Unicode)]
    public native boolean C2I_GetPageStream(int hMem, int lSize, Byte[] pStream);

    // / <summary>
    // / 查找文字，初始化文字区域数组。与C2IGetFoundResult成对使用
    // / </summary>
    // / <param name="hDoc"></param>
    // / <param name="dwPage"></param>
    // / <param name="szFind"></param>
    // / <param name="bCaseSensitive"></param>
    // / <param name="bWholeWord"></param>
    // / <param name="strtFoundTextInfo"></param>
    // / <returns></returns>
    // [DllImport("CEBX2Image.dll", CharSet = CharSet.Auto)]
    // public native boolean C2I_FindText(int hDoc, long dwPage, String szFind,
    // boolean caseSensitive, boolean wholeWord, C2IFOUNDTEXTINFO
    // strtFoundTextInfo);

    // / <summary>
    // / 获取文字查找结果
    // / </summary>
    // / <param name="strtFoundTextInfo"></param>
    // / <param name="nRectCounts"></param>
    // / <param name="dCoordinates"></param>
    // / <returns></returns>
    // [DllImport("CEBX2Image.dll", CharSet = CharSet.Auto)]
    // public native boolean C2I_GetFoundResult(ref C2IFOUNDTEXTINFO
    // strtFoundTextInfo, int[] nRectCounts, double[] dCoordinates);

    // / <summary>
    // / 初始化指定页指定矩形区域内文字内容。与C2IGetPageTextContent成对使用。
    // / </summary>
    // / <param name="hDoc"></param>
    // / <param name="dwPage"></param>
    // / <param name="strtPageTextContentInfo"></param>
    // / <param name="bOriginal"></param>
    // / <param name="bAutoBreakLine"></param>
    // / <param name="pDesRect"></param>
    // / <returns></returns>
    // [DllImport("CEBX2Image.dll", CharSet = CharSet.Auto)]
    // public native boolean C2I_InitPageTextContent(int hDoc, long dwPage, ref
    // C2IPAGETEXTCONTENTINFO strtPageTextContentInfo, boolean bOriginal,
    // boolean bAutoBreakLine, ref C2I_DRECT pDesRect);

    // / <summary>
    // / 获取指定页指定矩形区域内文字内容。
    // / </summary>
    // / <param name="pText"></param>
    // / <param name="pCoordinates"></param>
    // / <param name="strtPageTextContentInfo"></param>
    // / <returns></returns>
    // [DllImport("CEBX2Image.dll", CharSet = CharSet.Auto)]
    // public native boolean C2I_GetPageTextContent(char[] pText, ref
    // C2IPAGETEXTCONTENTINFO strtPageTextContentInfo);

    // / <summary>
    // / 初始化指定页每个文字矩形坐标。与C2IGetPageTextRect成对使用。
    // / </summary>
    // / <param name="hDoc"></param>
    // / <param name="dwPage"></param>
    // / <param name="rectInfo"></param>
    // / <returns></returns>
    // [DllImport("CEBX2Image.dll", CharSet = CharSet.Auto)]
    // public native boolean C2I_InitPageTextRect(int hDoc, long dwPage, ref
    // C2IPAGERECTINFO rectInfo);

    // / <summary>
    // / 获取指定页每个文字矩形坐标，数据以一维坐标形式表示。按如下格式展示数据：X0,Y0,X1,Y1依次展开成一维，接下来四个数据是下一个字的坐标
    // / </summary>
    // / <param name="pCoordinates"></param>
    // / <param name="rectInfo"></param>
    // / <returns></returns>
    // [DllImport("CEBX2Image.dll", CharSet = CharSet.Auto)]
    // public native boolean C2I_GetPageTextRect(double[] pCoordinates, ref
    // C2IPAGERECTINFO rectInfo);

    // / <summary>
    // / 获取书签目录枚举
    // / </summary>
    // / <param name="hDoc">文件句柄</param>
    // / <param name="handle">枚举句柄</param>
    // / <returns></returns>
    // [DllImport("CEBX2Image.dll", CharSet = CharSet.Auto)]
    // public native boolean C2I_GetOutlineEnumerator(int hDoc, Integer handle);

    // / <summary>
    // / 当前目录
    // / </summary>
    // / <param name="handle"></param>
    // / <param name="outlineItem"></param>
    // / <returns></returns>
    // [DllImport("CEBX2Image.dll", CharSet = CharSet.Auto)]
    // public native boolean C2I_OutlineCurrent(int handle, ref C2IOUTlINEITEM
    // outlineItem);

    // / <summary>
    // / 将枚举变量移到下一个位置，注意每前进一步，已将前一个内容删除。
    // / 如要重新获得目录，需要重新获取新的枚举器。
    // / </summary>
    // / <param name="handle"></param>
    // / <returns>当返回0时不应再调用C2I_OutlineCurrent</returns>
    // [DllImport("CEBX2Image.dll", CharSet = CharSet.Auto)]
    // public native int C2I_OutlineMoveNext(int handle);

    // / <summary>
    // / 释放目录枚举器
    // / </summary>
    // / <param name="handle"></param>
    // / <returns></returns>
    // [DllImport("CEBX2Image.dll", CharSet = CharSet.Auto)]
    public native boolean C2I_FreeOutlineEnumerator(int handle);

    // / <summary>
    // / 关闭文件
    // / </summary>
    // / <param name="hDoc"></param>
    // / <returns></returns>
    // [DllImport("CEBX2Image.dll", CharSet = CharSet.Auto)]
    public native boolean C2I_CloseDoc(int hDoc);

    // / <summary>
    // / 释放CEBX Toolkit
    // / </summary>
    // / <param name="type"></param>
    // / <returns></returns>
    // [DllImport("CEBX2Image.dll", CharSet = CharSet.Auto)]
    public native boolean C2I_End(int type);

    public static void main(String[] args)
    {
        JniTest test = new JniTest();
        if (test.C2I_Init(0))
        {
            System.out.println("success");
        }
        Integer msgCode = 0;

        // ByteBuffer.allocate(100);

        int hDoc = test.C2I_OpenDoc(
                "D:\\Develop\\android\\Ragnaros Hotfix 4.3.2.1844\\Document\\CEBXEditorKernel.cebx",
                0, msgCode);

        Args input = new Args();
        // ByteArray byt = new ByteArray();
        // input.setValue("data", byt);
        try
        {
            // test.C2I_GetSize(hDoc, 1, 1, 1, input);
            int size = test.GetSize(hDoc, 2, 1, 1, input);
            System.out.println(size);


            byte[] data = (byte[]) input.getValue("data");



            BufferedImage bu = ImageIO.read(new File("D:\\temp\\Sunset.jpg"));

            ByteArrayOutputStream imageStream = new ByteArrayOutputStream();
            boolean resultWrite = ImageIO.write(bu, "jpg", imageStream);
            byte[] tagInfo = imageStream.toByteArray();



            Image img = Toolkit.getDefaultToolkit().createImage(data, 0,
                    data.length);

            // ByteArrayInputStream outp = new
            // ByteArrayInputStream(data,0,data.length);
            // BufferedImage image =ImageIO.read(outp);

            AwtImage ai = new AwtImage(img);

        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        System.out.println(input);
        if (test.C2I_End(0))
        {
            System.out.println("success");
        }
    }


}
class AwtImage extends Frame
{

    Image img;
    public AwtImage(Image img)
    {
        super("Image Frame");
        this.img =img;
        MediaTracker mt = new MediaTracker(this);
        mt.addImage(img, 0);
        setSize(400, 400);
        setVisible(true);
        addWindowListener(new WindowAdapter()
        {
            public void windowClosing(WindowEvent we)
            {
                dispose();
            }
        });
    }

    public void update(Graphics g)
    {
        paint(g);
    }

    public void paint(Graphics g)
    {
        if (img != null)
            g.drawImage(img, 100, 100, this);
        else
            g.clearRect(0, 0, getSize().width, getSize().height);
    }
}